package com.htfyun.hardware;

import android.content.Context;
import android.content.Intent;
import android.hardware.htfyun.IHTUpdateImageListener;
import android.hardware.htfyun.IHTUpdateImageService;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.RemoteException;
import android.util.Log;

import com.htfyun.hardware.reflect.Utils;

/**
 * 尝试升级image, 支持 update.zip 和 update.img, 优先是 update.zip
 * 1. 首先将要升级的img或者zip重命名为 update.zip 或者 update.img, 放到 /sdcard/ 根目录下,
 *    或者 TF 卡(格式要求是 FAT32) 的根目录下;
 * 2 存在 update.zip 时, 检查他是是否是有效的;
 *   存在 update.img 时, 检查其 product name 是否和设备的 product name 匹配;
 * 3. 检查成功后, 开始进入升级模式;
 *
 * !!! 注意: 测试发现, rk那边从7.0开始已经不支持update.img的升级了!!!!!!
 *
 */
public class HTUpdateImageController {
    private static final String TAG = "HTUpdateImageController";

    private static final String HT_UPDATE_IMG_ACTION = "htfyun.service.action.UPDATE_IMAGE";

    private static HTUpdateImageController sInstance = null;
    private IHTUpdateImageService mService = null;

    private OnHTUpdateImageListener onHTUpdateImageListener;

    private final HTUpdateImageListener htUpdateImageListener = new HTUpdateImageListener();

    private Handler mHandler = new Handler(Looper.getMainLooper());

    public interface OnHTUpdateImageListener {
        /**
         * 在 sdcard 或者 T卡 根目录下没有找见 update.img 或者 update.zip 文件
         */
        void onImageNotFound();
        /**
         * 针对 ota 的 update.zip 文件进行判断
         * @param valid: true, update.zip 是 ok 的; false, update.zip 有问题
         */
        void onImageVerify(boolean valid);

        /**
         * 针对 update.img 文件, 才会去检测 rk image product name
         * !!! 注意: 测试发现, rk那边从7.0开始已经不支持update.img的升级了!!!!!!
         * @deprecated
         * @param deviceProductName 设备的 product name
         * @param imageProductName img 的 product name
         */
        void onImageProductNameMismatch(String deviceProductName, String imageProductName);
    }

    private HTUpdateImageController() {
        IBinder binder = Utils.getSystemServiceReflect("HTUpdateImageService");
        if (binder == null) {
            Log.e(TAG, "Could not retrieve HTUpdateImageService");
            return;
        }
        mService = IHTUpdateImageService.Stub.asInterface(binder);
    }

    public static synchronized HTUpdateImageController getInstance() {
        if (sInstance == null) {
            sInstance = new HTUpdateImageController();
        }
        return sInstance;
    }

    /**
     *
     * @param listener 一次性使用, 监听到反馈后, 就不再监听了. 收到监听后, onHTUpdateImageListener 会设置为 null
     */
    public void startUpdateImage(OnHTUpdateImageListener listener) {
        if (mService == null) {
            return;
        }
        onHTUpdateImageListener = listener;

        try {
            mService.startUpdateImage(htUpdateImageListener);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    /**
     * 升级之后, 最好第一次开机去调用这个方法查看升级结果. <p>
     *     查看之后, 升级状态的文件就被删除了, 即只能查看一次.
     *
     * @return true: 升级成功; false: 升级失败
     */
    public boolean isUpdateImageSuccessful() {
        if (mService == null) {
            return false;
        }
        try {
            return mService.isUpdateImageSuccessful();
        } catch (RemoteException e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * @deprecated 建议使用 {@link #startUpdateImage(OnHTUpdateImageListener)}
     * @param context
     */
    public void startUpdateImageByBroadcast(Context context) {
        if (context == null) {
            return;
        }
        Intent intent = new Intent(HT_UPDATE_IMG_ACTION);
        context.sendBroadcast(intent);
    }

    private class HTUpdateImageListener extends IHTUpdateImageListener.Stub {

        @Override
        public IBinder asBinder() {
            return this;
        }

        @Override
        public void onImageNotFound() throws RemoteException {

            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    if (onHTUpdateImageListener != null) {
                        onHTUpdateImageListener.onImageNotFound();
                        onHTUpdateImageListener = null;
                    }
                }
            });

        }

        @Override
        public void onImageVerify(boolean valid) throws RemoteException {
            final boolean validF = valid;
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    if (onHTUpdateImageListener != null) {
                        onHTUpdateImageListener.onImageVerify(validF);
                        onHTUpdateImageListener = null;
                    }
                }
            });

        }

        @Override
        public void onImageProductNameMismatch(String deviceProductName, String imageProductName) throws RemoteException {
            final String deviceProductNameF = deviceProductName;
            final String imageProductNameF = imageProductName;
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    if (onHTUpdateImageListener != null) {
                        onHTUpdateImageListener.onImageProductNameMismatch(deviceProductNameF, imageProductNameF);
                        onHTUpdateImageListener = null;
                    }
                }
            });
        }
    }

}
